自宅とAWSをVPN接続してみた (Ciscoルータ編)
はじめに
コンサルティング部の川原です。
我が家ではインターネット接続用のルータとして Cisco C841M を使っています。 (Amazon などで案外お手軽に購入できます。)
AWS VPNサービス( + CloudFormation) のお勉強と個人的な興味を兼ねて、 今回は オンプレ環境(自宅) のCiscoルータと AWSのサイト間VPN接続環境 を構築してみます。
※なお、オンプレ(自宅)とAWSのサイト間VPN記事自体は下記の通り、先人がいらっしゃいます。 違いとしては、「オンプレ側がCiscoルータ」、「BGPを使用しない」ぐらいです。
概要
構成図
家の回線は 2セッションまで PPPoE接続ができるので、 余りの 1セッションを AWSとのVPN接続に使用します。
- オンプレ(自宅)側 のサブネット: 192.168.10.0/24
- AWS側 のサブネット: 172.20.0.0/24
手順
- CloudFormation でAWS側のネットワークリソースを作成
- オンプレ側 CiscoルータのVPN設定
- VPN接続確認
CloudFormationでリソース作成
AWS側のネットワークリソースを CloudFormationで作成します。
CustomerGateway の IpAddress
には自宅のグローバルIPを記入します。
- VPC
- Subnet
- CustomerGateway
- VPNGateway
- VPNConnection
- RouteTable
AWSTemplateFormatVersion: '2010-09-09' Parameters: SystemName: Description: "System name of each resource names." Type: String Default: "devio" EnvironmentName: Description: "Environment name of each resource names." Type: String Default: "test" Resources: # VPC VPC1: Type: AWS::EC2::VPC Properties: CidrBlock: 172.20.0.0/16 EnableDnsSupport: true EnableDnsHostnames: true Tags: - Key: Name Value: Fn::Sub: "${SystemName}-${EnvironmentName}-vpc-1" # Subnet PrivateSubnet1: Type: AWS::EC2::Subnet Properties: VpcId: Ref: VPC1 CidrBlock: 172.20.0.0/24 AvailabilityZone: "ap-northeast-1a" MapPublicIpOnLaunch: False Tags: - Key: Name Value: Fn::Sub: "${SystemName}-${EnvironmentName}-private-subnet-1" # CustomerGateway CustomerGateway1: Type: AWS::EC2::CustomerGateway Properties: Type: ipsec.1 BgpAsn: 65000 IpAddress: XXX.XXX.XXX.XXX Tags: - Key: Name Value: Fn::Sub: "${SystemName}-${EnvironmentName}-cgw-1" # VPNGateway VPNGateway1: Type: AWS::EC2::VPNGateway Properties: Type: ipsec.1 Tags: - Key: Name Value: Fn::Sub: "${SystemName}-${EnvironmentName}-vgw-1" AttachVpnGateway1: Type: AWS::EC2::VPCGatewayAttachment Properties: VpcId: Ref: VPC1 VpnGatewayId: Ref: VPNGateway1 # VPNConnection VPNConnection1: Type: AWS::EC2::VPNConnection Properties: Type: ipsec.1 StaticRoutesOnly: true CustomerGatewayId: Ref: CustomerGateway1 VpnGatewayId: Ref: VPNGateway1 Tags: - Key: Name Value: Fn::Sub: "${SystemName}-${EnvironmentName}-vpn-connection-1" VPNConnectionRoute1: Type: AWS::EC2::VPNConnectionRoute Properties: DestinationCidrBlock: 192.168.10.0/24 VpnConnectionId: Ref: VPNConnection1 # RouteTable PrivateRouteTable1: Type: AWS::EC2::RouteTable Properties: VpcId: Ref: VPC1 Tags: - Key: Name Value: Fn::Sub: "${SystemName}-${EnvironmentName}-private-rtb-1" PrivateRoute1: Type: AWS::EC2::Route DependsOn: AttachVpnGateway1 Properties: RouteTableId: Ref: PrivateRouteTable1 DestinationCidrBlock: 192.168.10.0/24 GatewayId: Ref: VPNGateway1 PrivateRtbAssociation1: Type: AWS::EC2::SubnetRouteTableAssociation Properties: RouteTableId: Ref: PrivateRouteTable1 SubnetId: Ref: PrivateSubnet1
次にAWS CLI上でスタック作成のコマンドを実行します。
aws cloudformation create-stack\ --stack-name vpnteststack\ --template-body file://(作成した YAMLファイルパス)\ --parameters ParameterKey="SystemName",ParameterValue="vpntest" ParameterKey="EnvironmentName",ParameterValue="network"
マネジメントコンソール上でリソースが作成されていることを確認します。
Ciscoルータ設定
マネジメントコンソールの VPN → サイト間のVPN接続
から作成されたVPN接続を選択します。
設定のダウンロード
から Cisco ルータに投入するConfig情報を取得します。
Config情報は以下のようなテキストファイルで、 IPsec Tunnel を2本作成する Configです。
このConfigを自宅Ciscoルータに流し込みます。
加えて VPCに向かう静的ルーティングを追加します。
ip route 172.20.0.0 255.255.255.0 Tunnel1 track 100 ip route 172.20.0.0 255.255.255.0 Tunnel2 track 200
VPN接続確認
VPN接続確認のため、自宅・AWS側それぞれにマシンを配置します。
EC2インスタンスには 自宅側(192.168.10.0/24) からの ICMP通信、SSH通信
を許可 する
セキュリティグループを適用させます。
- 自宅側: ノートPC (192.168.10.30)
- AWS側: Linux EC2インスタンス (172.20.0.10)
AWSマネジメントコンソール上で確認
作成したVPN接続のステータスが アップ となっていることを確認します。
Ciscoルータ コンソール上で確認
IPsec通信を構成する 2つのフェーズ (IKEフェーズ1, IKEフェーズ2) が成功しているか確認します。
- IKEフェーズ1
Ciscoルータ コンソールで
show crypto isakmp sa
を実行します。RO#show crypto isakmp sa IPv4 Crypto ISAKMP SA dst src state conn-id status (AWS側 GlobalIP#1) (自宅側 GlobalIP) QM_IDLE 2002 ACTIVE (AWS側 GlobalIP#2) (自宅側 GlobalIP) QM_IDLE 2001 ACTIVE
2つの コネクションの stateが QM_IDLE となっていれば OKです。
-
IKEフェーズ2
次は
show crypto ipsec sa
を実行します。RO#show crypt ipsec sa interface: Tunnel1 ︙ #pkts encaps: 463, #pkts encrypt: 463, #pkts digest: 463 <-- #pkts decaps: 201, #pkts decrypt: 201, #pkts verify: 201 <-- ︙ inbound esp sas: ︙ Status: ACTIVE(ACTIVE) <-- outbound esp sas: ︙ Status: ACTIVE(ACTIVE) <-- interface: Tunnel2 ︙ #pkts encaps: 197, #pkts encrypt: 197, #pkts digest: 197 <-- #pkts decaps: 375, #pkts decrypt: 375, #pkts verify: 375 <-- ︙ inbound esp sas: ︙ Status: ACTIVE(ACTIVE) <-- outbound esp sas: ︙ Status: ACTIVE(ACTIVE) <--
2つの Tunnelのステータスを確認します。
#pkts encaps: X, #pkts encrypt: X, #pkts digest: X
の X がカウントされていること#pkts decaps: Y, #pkts decrypt: Y, #pkts verify: Y
の Y がカウントされていることinbound/outbound esp sas:
のステータスが ACTIVE になっていること
Pingで確認
Pingで各マシン間の疎通を確認します。
- 自宅側ノートPCから AWS側EC2インスタンスに Pingが通る
- AWS側EC2インスタンスから 自宅側ノートPCに Pingが通る
おわりに
以上、AWSと自宅のサイト間VPN構築でした。 NAT + PPPoE の環境である場合はNATトラバーサル設定など、いくつか注意が必要です。
IPsecのセッションがうまく張れない、といったときは下記サイトが参考になります。